perm filename PIXLIB.SAI[VIS,HPM] blob
sn#178261 filedate 1975-10-12 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00008 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 entry pixdim,pfldim,getpfl,putpfl,campix,makpix
C00003 00003 internal INTEGER PROCEDURE PFLDIM(STRING FILNAM)
C00008 00004 internal INTEGER PROCEDURE GETPFL(STRING FILNAM REFERENCE INTEGER PICTURE)
C00013 00005 internal INTEGER PROCEDURE PIXDIM(INTEGER HEIGHT,WIDTH,BITS)
C00015 00006 internal INTEGER PROCEDURE PUTPFL(REFERENCE INTEGER PICTURE STRING FILNAM)
C00018 00007 internal INTEGER PROCEDURE CAMPIX(INTEGER CAMRA,YEDGE,XEDGE,SUMS,CLPINC
C00022 00008 end
C00024 ENDMK
C⊗;
entry pixdim,pfldim,getpfl,putpfl,campix,makpix;
begin
EXTERNAL PROCEDURE MAKTAB(REFERENCE INTEGER PICTURE);
STRING PROCEDURE DEV(STRING FILSPEC);
BEGIN
STRING S,T;
INTEGER I;
S←FILSPEC;
T←"";
WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←T&LOP(S);
RETURN(IF S[1 TO 1]=":" THEN T ELSE "DSK");
END;
STRING PROCEDURE NAM(STRING FILSPEC);
BEGIN
STRING S,T;
INTEGER I;
S←FILSPEC;
WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←LOP(S);
RETURN(IF S[1 TO 1]=":" THEN S[2 TO ∞] ELSE FILSPEC);
END;
internal INTEGER PROCEDURE PFLDIM(STRING FILNAM);
comment returns the size of the picture FILNAM on disk.
used for allocating arrays in preparation for
actually reading them. Returns 0 on failure.;
BEGIN
INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
INTEGER ARRAY BUF[0:'177];
OPEN(10,DEV(FILNAM),'10,2,0,XXCOUNT,XXBRCHAR,XXEOF);
LOOKUP(10,NAM(FILNAM),XXFLAG);
IF XXFLAG THEN
BEGIN
CLOSE(10);
RETURN(0);
END
ELSE
BEGIN
INTEGER K,KK;
ARRYIN(10,BUF[0],'200); CLOSE(10);
IF BUF[0]=-1 THEN
BEGIN
KK←0;
FOR K←18,17,16,15,10,9,8,7 DO IF BUF[K]≠0 THEN KK←K;
IF KK=0 THEN RETURN(0);
BYBI←BUF[1];
LNBY←BUF[6]-BUF[5]+1;
PCLN←BUF[4]-BUF[3]+1;
LNWD←BUF[2];
LNBYA←LNWD*(36%BYBI);
PCWD←LNWD*PCLN;
RETURN(12+PCLN+LNBYA+PCWD);
END
ELSE
BEGIN
BYBI←BUF[2];
LNBY←BUF[8]-BUF[7]+1;
PCLN←BUF[6]-BUF[5]+1;
WDBY←36%BYBI;
LNWD←(LNBY+WDBY-1)%WDBY;
LNBYA←LNWD*WDBY;
PCWD←PCLN*LNWD;
PCBY←PCLN*LNBY;
PCBYA←PCLN*LNBYA;
WDBI←WDBY*BYBI;
IF BYBI≤0 ∨ BYBI>36 ∨ LNBY≤0 ∨ PCLN≤0 ∨ BUF[0]<0 THEN RETURN(0)
ELSE RETURN(12+PCLN+LNBYA+PCWD);
END;
END;
END;
internal INTEGER PROCEDURE GETPFL(STRING FILNAM; REFERENCE INTEGER PICTURE);
comment read the picture in file FILNAM into area of core whose first
word is PICTURE. PFLDIM(FILNAM) words are needed.
Returns picture size of success, 0 on failure.;
BEGIN
INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
INTEGER I,L;
INTEGER ARRAY BUF[0:'177];
OPEN(10,DEV(FILNAM),'10,2,0,XXCOUNT,XXBRCHAR,XXEOF);
LOOKUP(10,NAM(FILNAM),XXFLAG);
IF XXFLAG THEN
BEGIN
CLOSE(10);
RETURN(0);
END
ELSE
BEGIN
INTEGER K,KK;
ARRYIN(10,BUF[0],10);
IF BUF[0]=-1 THEN
BEGIN
ARRYIN(10,BUF[10],'200-10);
KK←0;
FOR K←18,17,16,15,10,9,8,7 DO IF BUF[K]≠0 THEN KK←K;
IF KK=0 THEN
BEGIN
CLOSE(10);
RETURN(0);
END;
L←LOCATION(PICTURE);
MEMORY[L+9]←BYBI←BUF[1];
MEMORY[L+5]←LNBY←BUF[6]-BUF[5]+1;
MEMORY[L+0]←PCLN←BUF[4]-BUF[3]+1;
MEMORY[L+7]←WDBY←36%BYBI;
MEMORY[L+4]←LNWD←BUF[2];
MEMORY[L+6]←LNBYA←LNWD*WDBY;
MEMORY[L+1]←PCWD←PCLN*LNWD;
MEMORY[L+2]←PCBY←PCLN*LNBY;
MEMORY[L+3]←PCBYA←PCLN*LNBYA;
MEMORY[L+8]←WDBI←WDBY*BYBI;
MEMORY[L+10]←12+PCLN+L;
MAKTAB(PICTURE);
XXPICLOC←(BUF[KK] LAND '777777)-'200;
FOR I←1 STEP 1 UNTIL XXPICLOC DO WORDIN(10);
ARRYIN(10,MEMORY[L+12+PCLN+LNBYA],PCWD);
CLOSE(10);
RETURN(12+PCLN+LNBYA+PCWD);
END
ELSE
BEGIN comment if old hand eye format;
L←LOCATION(PICTURE);
MEMORY[L+9]←BYBI←BUF[2];
MEMORY[L+5]←LNBY←BUF[8]-BUF[7]+1;
MEMORY[L+0]←PCLN←BUF[6]-BUF[5]+1;
MEMORY[L+7]←WDBY←36%BYBI;
MEMORY[L+4]←LNWD←(LNBY+WDBY-1)%WDBY;
MEMORY[L+6]←LNBYA←LNWD*WDBY;
MEMORY[L+1]←PCWD←PCLN*LNWD;
MEMORY[L+2]←PCBY←PCLN*LNBY;
MEMORY[L+3]←PCBYA←PCLN*LNBYA;
MEMORY[L+8]←WDBI←WDBY*BYBI;
MEMORY[L+10]←12+PCLN+L;
IF BYBI≤0 ∨ BYBI>36 ∨ LNBY≤0 ∨ PCLN≤0 ∨ BUF[0]<0 THEN
BEGIN
CLOSE(10);
RETURN(0);
END;
MAKTAB(PICTURE);
ARRYIN(10,MEMORY[L+12+PCLN+LNBYA],PCWD);
CLOSE(10);
RETURN(12+PCLN+LNBYA+PCWD);
END;
END;
END;
internal INTEGER PROCEDURE PIXDIM(INTEGER HEIGHT,WIDTH,BITS);
comment returns the size of the array needed to hold a hypothetical
picture HEIGHT scanlines by WIDTH pixels per scanline
by BITS bits per pixel.;
BEGIN
INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
INTEGER L;
BYBI←BITS;
LNBY←WIDTH;
PCLN←HEIGHT;
WDBY←36%BYBI;
LNWD←(LNBY+WDBY-1)%WDBY;
LNBYA←LNWD*WDBY;
PCWD←PCLN*LNWD;
RETURN(12+PCLN+LNBYA+PCWD);
END;
internal INTEGER PROCEDURE MAKPIX(INTEGER HEIGHT,WIDTH,BITS; REFERENCE INTEGER PICTURE);
comment actually creates an empty picture HEIGHT by WIDTH by BITS in
the area of core beginning with PICTURE. Returns its size.;
BEGIN
INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
INTEGER I,L;
L←LOCATION(PICTURE);
MEMORY[L+9]←BYBI←BITS;
MEMORY[L+5]←LNBY←WIDTH;
MEMORY[L+0]←PCLN←HEIGHT;
MEMORY[L+7]←WDBY←36%BYBI;
MEMORY[L+4]←LNWD←(LNBY+WDBY-1)%WDBY;
MEMORY[L+6]←LNBYA←LNWD*WDBY;
MEMORY[L+1]←PCWD←PCLN*LNWD;
MEMORY[L+2]←PCBY←PCLN*LNBY;
MEMORY[L+3]←PCBYA←PCLN*LNBYA;
MEMORY[L+8]←WDBI←WDBY*BYBI;
MEMORY[L+10]←12+PCLN+L;
MAKTAB(PICTURE);
RETURN(12+PCLN+LNBYA+PCWD);
END;
internal INTEGER PROCEDURE PUTPFL(REFERENCE INTEGER PICTURE; STRING FILNAM);
comment write out the picture in the core area starting with
PICTURE, creating a file called FILNAM. Returns
the size of the original file on success, else 0.;
BEGIN
INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
INTEGER I,L;
INTEGER ARRAY BUF[0:'177];
OPEN(10,DEV(FILNAM),'10,0,2,XXCOUNT,XXBRCHAR,XXEOF);
ENTER(10,NAM(FILNAM),XXFLAG);
IF XXFLAG THEN
BEGIN
CLOSE(10);
RETURN(0);
END
ELSE
BEGIN
L←LOCATION(PICTURE);
BUF[0]←-1;
BUF[1]←BYBI←MEMORY[L+9];
BUF[2]←LNWD←MEMORY[L+4];
BUF[3]←1; BUF[4]←PCLN←MEMORY[L+0];
BUF[5]←1; BUF[6]←LNBY←MEMORY[L+5];
BUF[7]←((-(PCWD←MEMORY[L+1])) LSH 18) LOR '200;
WDBY←36%BYBI;
LNWD←(LNBY+WDBY-1)%WDBY;
LNBYA←LNWD*WDBY;
ARRYOUT(10,BUF[0],'200);
ARRYOUT(10,MEMORY[L+12+PCLN+LNBYA],PCWD);
CLOSE(10);
RETURN(12+PCLN+LNBYA+PCWD);
END;
END;
internal INTEGER PROCEDURE CAMPIX(INTEGER CAMRA,YEDGE,XEDGE,SUMS,CLPINC;
REFERENCE INTEGER PICTURE);
comment read a picture from camera CAMRA of size defined by array PICTURE
the area of core beginning with PICTURE. Upper left hand
corner is at PICX,PICY. SUMS and CLPINC are averaging params.;
BEGIN
INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI,LINTAB;
INTEGER L,CAM;
EXTERNAL INTEGER ERROR,TVCAM;
IF CAMRA>'40 THEN CAMRA←CAMRA LAND '67;
IF CAMRA='41∨CAMRA='42 THEN CAM←CAMRA LAND 3 ELSE
BEGIN
INTEGER I,J;
I←'401400000000 LOR LOCATION(J);
J←IF CAMRA≥'40 THEN CAMRA LAND 7 ELSE 1 LSH (35-CAMRA);
START_CODE
MOVE 1,I;
CALLI 1,'400070; COMMENT VDSMAP;
JUMP 0,0;
END;
CAM←3;
END;
L←LOCATION(PICTURE);
PCLN←MEMORY[L+0];
PCWD←MEMORY[L+1];
LNWD←MEMORY[L+4];
LNBY←MEMORY[L+5];
LNBYA←MEMORY[L+6];
BYBI←MEMORY[L+9];
LINTAB←MEMORY[L+11];
ERROR←1; TVCAM←CAM;
IF SUMS>1 ∨ CLPINC<8 ∨ BYBI≠4 THEN
BEGIN
comment use Quam's general picture taker;
EXTERNAL PROCEDURE TVSIX(INTEGER ARRAY PARS; INTEGER SUMS,CLPINC);
EXTERNAL PROCEDURE PICREL(INTEGER ARRAY PIC);
DEFINE SCALEX="0",SCALEY="1",POSX="2",POSY="3",SIZEX="4",SIZEY="5",
SIZEL="6",PTR="7",NAME="8",BIT="9",GAIN="10",OFFSET="11";
comment for interfacing quam internal format;
INTEGER ARRAY PIC[0:15];
PIC[POSX]←XEDGE; PIC[POSY]←YEDGE;
PIC[BIT]←BYBI;
PIC[SIZEX]←LNBY;
PIC[SIZEY]←PCLN;
PIC[SIZEL]←LNWD;
TVSIX(PIC,SUMS,CLPINC);
ARRBLT(MEMORY[LINTAB],MEMORY[PIC[PTR] LAND '777777],PCWD);
PICREL(PIC);
END
ELSE
BEGIN
EXTERNAL PROCEDURE TVIN;
EXTERNAL INTEGER BCLIP,TCLIP,FLINE,LLINE,LSIDE,RSIDE,TVWORD;
BCLIP←7; TCLIP←0;
FLINE←YEDGE; LLINE←FLINE+PCLN-1;
LSIDE←XEDGE; RSIDE←LSIDE+LNBY-1;
TVWORD←((-PCWD) LSH 18) LOR (LINTAB-1);
TVIN;
END;
RETURN(12+PCLN+LNBYA+PCWD);
END;
end